"""
发行人信用分析智能体

基于LangGraph ReAct模式，分析发行人的偿债能力与信用质量。
"""

from typing import Dict, Any, List, Optional
from langchain_core.tools import Tool

from agents import BondAnalysisAgent, LLMConfig
from tools.bond_data_provider import bond_data_provider


class IssuerCreditAnalysisAgent(BondAnalysisAgent):
    """发行人信用分析智能体"""
    
    def __init__(self, llm_config: Optional[LLMConfig] = None):
        super().__init__(
            name="issuer_credit_analysis",
            description="分析发行人的偿债能力与信用质量",
            llm_config=llm_config
        )
        
        self.analysis_dimensions = ["fundamental", "corporate"]
    
    def get_tools(self) -> List[Tool]:
        """获取发行人信用分析所需的工具"""
        
        async def get_bond_info(bond_code: str) -> str:
            """获取债券基本信息"""
            try:
                info = await bond_data_provider.get_bond_basic_info(bond_code)
                if not info:
                    return f"未找到债券{bond_code}的信息"
                
                result = f"债券代码: {info.get('债券代码')}\n"
                result += f"债券简称: {info.get('债券简称')}\n"
                result += f"正股代码: {info.get('正股代码')}\n"
                result += f"正股名称: {info.get('正股名称')}\n"
                result += f"正股价: {info.get('正股价', 'N/A')}\n"
                result += f"债现价: {info.get('债现价', 'N/A')}\n"
                result += f"发行规模: {info.get('发行规模', 'N/A')}\n"
                result += f"剩余规模: {info.get('剩余规模', 'N/A')}\n"
                result += f"债券评级: {info.get('信用评级', 'N/A')}\n"
                result += f"转股价: {info.get('转股价', 'N/A')}\n"
                
                return result
            except Exception as e:
                return f"获取债券信息失败: {str(e)}"
        
        async def get_underlying_stock_code(bond_code: str) -> str:
            """获取债券对应的正股代码"""
            try:
                stock_code = await bond_data_provider.get_underlying_stock_code(bond_code)
                if stock_code:
                    return f"债券{bond_code}对应的正股代码为: {stock_code}"
                return f"未找到债券{bond_code}对应的正股代码"
            except Exception as e:
                return f"获取正股代码失败: {str(e)}"
        
        async def analyze_bond_rating(bond_code: str) -> str:
            """分析债券评级（使用修复后的多数据源）"""
            try:
                info = await bond_data_provider.get_bond_basic_info(bond_code)
                if not info:
                    return "未找到债券评级信息"
                
                rating = info.get('信用评级', 'N/A')
                scale = info.get('发行规模', 'N/A')
                remaining = info.get('剩余规模', 'N/A')
                
                result = f"债券评级: {rating}\n"
                result += f"发行规模: {scale}亿元\n"
                result += f"剩余规模: {remaining}亿元\n"
                
                # 转股信息
                result += f"\n转股相关信息:\n"
                result += f"转股价: {info.get('转股价', 'N/A')}元\n"
                result += f"转股价值: {info.get('转股价值', 'N/A')}元\n"
                result += f"转股溢价率: {info.get('转股溢价率', 'N/A')}%\n"
                
                # 简单的评级分析
                result += "\n评级分析:\n"
                if rating in ['AAA', 'AA+']:
                    result += "✓ 评级较高，信用风险较低"
                elif rating in ['AA', 'AA-']:
                    result += "评级中等偏上，信用风险可控"
                elif rating in ['A+', 'A']:
                    result += "评级一般，需关注信用风险"
                else:
                    result += "⚠ 评级信息不足，建议谨慎"
                
                return result
            except Exception as e:
                return f"分析债券评级失败: {str(e)}"
        
        # 创建工具列表
        tools = [
            Tool(
                name="get_bond_info",
                description="获取债券的基本信息，包括代码、名称、价格、评级等",
                func=lambda bond_code: None,  # 同步占位
                coroutine=get_bond_info,
            ),
            Tool(
                name="get_underlying_stock_code",
                description="获取可转债对应的正股代码",
                func=lambda bond_code: None,
                coroutine=get_underlying_stock_code,
            ),
            Tool(
                name="analyze_bond_rating",
                description="分析债券的信用评级和发行规模",
                func=lambda bond_code: None,
                coroutine=analyze_bond_rating,
            ),
        ]
        
        return tools
    
    def get_system_prompt(self) -> str:
        """获取系统提示词"""
        return """你是一个专业的发行人信用分析专家，负责评估债券发行人的偿债能力和信用质量。

你的分析流程：
1. 首先使用 get_bond_info 工具获取债券基本信息
2. 使用 get_underlying_stock_code 获取正股代码
3. 使用 analyze_bond_rating 分析债券评级
4. 基于获取的信息，进行综合信用分析

分析要点：
- 债券评级反映信用质量
- 发行规模和剩余规模反映市场认可度
- 正股情况影响转股价值
- 综合给出信用评估和投资建议

请逐步使用工具获取信息，展示你的分析推理过程，最后给出专业的信用评估结论。
"""


# 全局实例
issuer_credit_agent = IssuerCreditAnalysisAgent()